package chaoyue.study.inner;

/**
 * 静态内部类
 * 为了避免类名重复，实际生成的类名其实是Outer$Inner这种形式，即JVM会自动帮我们拼上外部类的类名
 * 外部类的private属性JVM都会帮我们自动生成一个对应的access方法，以提供给内部类访问
 * 内部类会自动添加一个final的外部类对象和对应的构造器，将外部类组合进去以实现外部类属性和方法的访问
 */
public class StaticInnerClassTest {
    private static int outerShared = 100;

    private static void outerStaticMethod(){
        System.out.println("outer static method");
    }

    // 静态内部类 可以定义成public的
    // 外部使用这种public的静态内部类和使用普通的类并没有什么区别
    public static class StaticInnerPublic {
        private int innerShared = 200;

        // 因为是定义在类的内部，所以可以直接使用Outer的private声明的变量
        public void innerMethod() {
            System.out.println("inner " + innerShared);
        }

        // 里面同样可以有静态方法
        public static void innerStaticMethod() {
            System.out.println("inner static method" + StaticInnerClassTest.outerShared);
            outerStaticMethod(); // 可以访问外部类中private的静态方法
        }
    }

    // 内部类也可以定义成private的，只允许自己内部使用
    private static class StaticInnerPrivate {
        public void innerMethod() {
            System.out.println("inner-private " + outerShared);
        }
    }

    public static void main(String[] args) {
        // 静态内部类 可以使用引用的方式创建 因为跟外部类其实关系不大
        StaticInnerClassTest.StaticInnerPublic inner = new StaticInnerClassTest.StaticInnerPublic();
        inner.innerMethod();
        StaticInnerClassTest.StaticInnerPublic.innerStaticMethod();
        // 当前类内部可以访问private的内部类
        new StaticInnerPrivate().innerMethod();
    }
}
